﻿using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Csla;

namespace Sireass.Bl
{
    [Serializable]
    public class ActividadInformeInfo : ReadOnlyBase<ActividadInformeInfo>
    {
        #region Propiedades
        public static readonly PropertyInfo<long> IdActividadInformeProperty = RegisterProperty<long>(c => c.IdActividadInforme);
        [Display(Name = "Id de Actividad Informe")]
        public long IdActividadInforme
        {
            get { return GetProperty(IdActividadInformeProperty); }
            private set { LoadProperty(IdActividadInformeProperty, value); }
        }

        public static readonly PropertyInfo<long> IdInformeProperty = RegisterProperty<long>(c => c.IdInforme);
        [Display(Name = "Id de Informe")]
        public long IdInforme
        {
            get { return GetProperty(IdInformeProperty); }
            private set { LoadProperty(IdInformeProperty, value); }
        }

        public static readonly PropertyInfo<byte> IdTipoActividadProperty = RegisterProperty<byte>(c => c.IdTipoActividad);
        [Display(Name = "Id Tipo de Actividad")]
        public byte IdTipoActividad
        {
            get { return GetProperty(IdTipoActividadProperty); }
            private set { LoadProperty(IdTipoActividadProperty, value); }
        }

        public static readonly PropertyInfo<string> DescripcionProperty = RegisterProperty<string>(c => c.Descripcion);
        [Display(Name = "Descripción")]
        public string Descripcion
        {
            get { return GetProperty(DescripcionProperty); }
            set { LoadProperty(DescripcionProperty, value); }
        }

        public static readonly PropertyInfo<bool> HabilitadoProperty = RegisterProperty<bool>(c => c.Habilitado);
        [Display(Name = "Habilitado")]
        public bool Habilitado
        {
            get { return GetProperty(HabilitadoProperty); }
            set { LoadProperty(HabilitadoProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaAltaProperty = RegisterProperty<DateTime>(c => c.FechaAlta);
        [Display(Name = "Fecha Alta")]
        public DateTime FechaAlta
        {
            get { return GetProperty(FechaAltaProperty); }
            set { LoadProperty(FechaAltaProperty, value); }
        }

        public static readonly PropertyInfo<DateTime> FechaBajaProperty = RegisterProperty<DateTime>(c => c.FechaBaja);
        [Display(Name = "Fecha Baja")]
        public DateTime FechaBaja
        {
            get { return GetProperty(FechaBajaProperty); }
            set { LoadProperty(FechaBajaProperty, value); }
        }
        #endregion
        #region Factory
        public static ActividadInformeInfo GetActividadInformeInfo(ActividadInformeCriteria criteria)
        {
            return DataPortal.Fetch<ActividadInformeInfo>(criteria);
        }
        #endregion
        #region Métodos
        public static void AddObjectAuthorizationRules()
        {
            Type type = System.Reflection.MethodBase.GetCurrentMethod().DeclaringType;
            PerfilServicioCriteria criteria = new PerfilServicioCriteria(type.FullName, true);
            PerfilServicioList perfilesPorServicio = PerfilServicioList.GetPerfilServicioList(criteria);
            List<string> roles = new List<string>(perfilesPorServicio.Count);
            foreach (PerfilServicioInfo perfilServicio in perfilesPorServicio)
            {
                roles.Add(perfilServicio.Perfil);
            }
            Csla.Rules.BusinessRules.AddRule(type, new Csla.Rules.CommonRules.IsInRole(Csla.Rules.AuthorizationActions.GetObject, roles));
        }
        #endregion
        #region DataPortal
        private void Child_Fetch(System.Data.IDataReader data)
        {
            var safeData = new Csla.Data.SafeDataReader(data);
            IdActividadInforme = safeData.GetInt64("nId_Actividad_Informe");
            IdInforme = safeData.GetInt64("nId_Informe");
            IdTipoActividad = safeData.GetByte("nId_TipoActividad");
            Descripcion = safeData.GetString("cDescripcion");
            Habilitado = safeData.GetBoolean("bHabilitado");
            FechaAlta = safeData.GetDateTime("dFecha_Alta");
            FechaBaja = safeData.GetDateTime("dFecha_Baja");
        }

        private void DataPortal_Fetch(ActividadInformeCriteria criteria)
        {
            using (var dalManager = Sireass.Dal.DalFactory.GetManager())
            {
                var dal = dalManager.GetProvider<Sireass.Dal.IActividadInformeDal>();
                using (var safeData = new Csla.Data.SafeDataReader(
                                    dal.Fetch(criteria.IdActividadInforme, criteria.IdInforme, criteria.IdTipoActividad)))
                {
                    if (safeData.Read())
                    {
                        IdActividadInforme = safeData.GetInt64("nId_Actividad_Informe");
                        IdInforme = safeData.GetInt64("nId_Informe");
                        IdTipoActividad = safeData.GetByte("nId_TipoActividad");
                        Descripcion = safeData.GetString("cDescripcion");
                    }
                }
            }
        }
        #endregion
    }
}
